package config

import (
	"fmt"
	"os"
	"path/filepath"

	"gopkg.in/yaml.v3"
)

// FileConfig 表示配置文件的结构
type FileConfig struct {
	// 默认输出格式
	Format string `yaml:"format,omitempty"`

	// 默认输出文件
	OutputFile string `yaml:"output_file,omitempty"`

	// 详细级别
	Verbose bool `yaml:"verbose,omitempty"`

	// 默认要收集的模块
	Modules struct {
		System  bool `yaml:"system,omitempty"`
		CPU     bool `yaml:"cpu,omitempty"`
		Memory  bool `yaml:"memory,omitempty"`
		Disk    bool `yaml:"disk,omitempty"`
		Network bool `yaml:"network,omitempty"`
		Ports   bool `yaml:"ports,omitempty"`
		Process bool `yaml:"process,omitempty"`
		SMART   bool `yaml:"smart,omitempty"`
		GPU     bool `yaml:"gpu,omitempty"`
		Battery bool `yaml:"battery,omitempty"`
	} `yaml:"modules,omitempty"`

	// SMART监控配置
	SMART struct {
		EnableAlerts    bool `yaml:"enable_alerts,omitempty"`
		EnableAnalysis  bool `yaml:"enable_analysis,omitempty"` // 收集SMART时自动分析
		AlertThresholds struct {
			TemperatureCritical int `yaml:"temperature_critical,omitempty"`
			TemperatureWarning  int `yaml:"temperature_warning,omitempty"`
		} `yaml:"alert_thresholds,omitempty"`
		WebhookURL string `yaml:"webhook_url,omitempty"`
		DBPath     string `yaml:"db_path,omitempty"` // 自定义历史数据库路径
	} `yaml:"smart,omitempty"`

	// 进程监控配置
	Process struct {
		TopCount int `yaml:"top_count,omitempty"` // 要显示的顶级进程数量
	} `yaml:"process,omitempty"`

	// 显示偏好
	Display struct {
		UseASCII bool `yaml:"use_ascii,omitempty"` // 强制使用ASCII输出而不是Unicode
	} `yaml:"display,omitempty"`
}

// LoadConfigFile 尝试从文件加载配置
// 搜索顺序: ./.sysinforc, ~/.config/sysinfo/config.yaml, ~/.sysinforc
func LoadConfigFile(customPath string) (*FileConfig, error) {
	var configPath string

	if customPath != "" {
		// 如果提供了自定义路径则使用它
		configPath = customPath
	} else {
		// 在标准位置搜索
		searchPaths := []string{
			".sysinforc",
			".sysinfo.yaml",
			filepath.Join(os.Getenv("HOME"), ".config", "sysinfo", "config.yaml"),
			filepath.Join(os.Getenv("HOME"), ".sysinforc"),
		}

		for _, path := range searchPaths {
			if _, err := os.Stat(path); err == nil {
				configPath = path
				break
			}
		}

		// 如果没有找到配置文件，返回空配置（使用默认值）
		if configPath == "" {
			return &FileConfig{}, nil
		}
	}

	// 读取配置文件
	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件 %s 失败: %w", configPath, err)
	}

	// 解析YAML
	var cfg FileConfig
	if err := yaml.Unmarshal(data, &cfg); err != nil {
		return nil, fmt.Errorf("解析配置文件 %s 失败: %w", configPath, err)
	}

	return &cfg, nil
}

// MergeWithFileConfig 合并文件配置与运行时配置
// CLI标志优先于文件配置
func (c *Config) MergeWithFileConfig(fileConfig *FileConfig) {
	// 仅在CLI未覆盖时应用文件配置
	if c.Format == "pretty" && fileConfig.Format != "" {
		c.Format = fileConfig.Format
	}

	if c.OutputFile == "" && fileConfig.OutputFile != "" {
		c.OutputFile = fileConfig.OutputFile
	}

	if !c.Verbose && fileConfig.Verbose {
		c.Verbose = fileConfig.Verbose
	}

	// 如果未指定--all，则合并模块设置
	if !c.Modules.All {
		if fileConfig.Modules.System {
			c.Modules.System = true
		}
		if fileConfig.Modules.CPU {
			c.Modules.CPU = true
		}
		if fileConfig.Modules.Memory {
			c.Modules.Memory = true
		}
		if fileConfig.Modules.Disk {
			c.Modules.Disk = true
		}
		if fileConfig.Modules.Network {
			c.Modules.Network = true
		}
		if fileConfig.Modules.Ports {
			c.Modules.Ports = true
		}
		if fileConfig.Modules.Process {
			c.Modules.Process = true
		}
		if fileConfig.Modules.SMART {
			c.Modules.SMART = true
		}
		if fileConfig.Modules.GPU {
			c.Modules.GPU = true
		}
		if fileConfig.Modules.Battery {
			c.Modules.Battery = true
		}
	}
}

// SaveConfigFile 保存当前配置到文件
func SaveConfigFile(cfg *FileConfig, path string) error {
	// 创建目录（如果不存在）
	dir := filepath.Dir(path)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("failed to create config directory: %w", err)
	}

	// 序列化为YAML
	data, err := yaml.Marshal(cfg)
	if err != nil {
		return fmt.Errorf("failed to marshal config: %w", err)
	}

	// 写入文件
	if err := os.WriteFile(path, data, 0644); err != nil {
		return fmt.Errorf("failed to write config file: %w", err)
	}

	return nil
}
